package com.example.gcode;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.app.ListActivity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

import com.gcloud.dropbox.UploadDropBoxFileActivity;
import com.gcloud.dto.GCloudFile;
import com.gcloud.googledrive.DownloadGoogleFileActivity;
import com.gcloud.googledrive.UploadGoogleFileActivity;
import com.gfilechooser.utils.FileUtils;
import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential;
import com.google.api.services.drive.Drive;
import com.utils.Constants;
import com.dropbox.client2.android.AndroidAuthSession;
import com.dropbox.client2.DropboxAPI;

public class Archivos extends ListActivity {

	private static final String TAG_NOMBRE = "TAG_NOMBRE";
	private static final String TAG_FILE_ID = "TAG_FILE_ID";
	Drive service;
	GoogleAccountCredential credential;
	private static final int REQUEST_CODE = 100;

	/* DROP BOX THINGS */
	DropboxAPI<AndroidAuthSession> mApi;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.archivos_list);
		registerForContextMenu(getListView());
		// credential = GoogleAccountCredential.usingOAuth2(
		// this, DriveScopes.DRIVE);
		// startActivityForResult(credential.newChooseAccountIntent(),
		// REQUEST_ACCOUNT);
		// dropBoxAuthentication();
		showFilesOnUi();
		// listFiles();

	}

	@Override
	public void onCreateContextMenu(ContextMenu menu, View v,
			ContextMenuInfo menuInfo) {
		super.onCreateContextMenu(menu, v, menuInfo);
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.layout.contextmenu, menu);
		Log.i("este tag", " si furula");
	}

	@Override
	public boolean onContextItemSelected(MenuItem item) {
		// TODO Auto-generated method stub
		AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
				.getMenuInfo();
		Intent actionIntent;
		switch (item.getItemId()) {
		case R.id.menu_bookmark:
			showToast("menu BOOKMARK"
					+ lista.get((int) info.id).get(TAG_NOMBRE));
			return true;
		case R.id.menu_search:
			showToast("menu SEARCH" + lista.get((int) info.id).get(TAG_NOMBRE));
			return true;
		case R.id.menu_save:
			Log.i("menu SAVE", lista.get((int) info.id).get(TAG_NOMBRE));
			
			
			
			actionIntent = new Intent(Archivos.this,
					DownloadGoogleFileActivity.class);
			actionIntent.putExtra(Constants.FILE_KEY, lista.get((int) info.id)
					.get(TAG_FILE_ID));
			startActivity(actionIntent);
			return true;
		default:
			return super.onContextItemSelected(item);
		}

	}

	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		// TODO Auto-generated method stub
		super.onListItemClick(l, v, position, id);
		String item = lista.get(position).get(TAG_NOMBRE);
		Log.i("on list item: ", item);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		Log.i("jalskjdf", "guaro!!");
		switch (item.getItemId()) {
		case R.id.menu_upload:

			Log.i("here", "upload");
			// showChooser();
			break;
		case R.id.menu_download:
			Log.i("here", "download");
			break;
		case R.id.menu_delete:
			Log.i("here", "delete");
			break;
		case R.id.menu_bookmark:
			Log.i("here", "bookmark");
			break;
		case R.id.menu_save:
			Log.i("here", "save");
			break;
		case R.id.menu_search:
			Log.i("here", "search");
			break;
		case R.id.menu_google_drive_sy:
			Log.i("here", "google drive");
			Intent intentnew = new Intent(Archivos.this,
					GoogleDriveSyncronized.class);
			startActivity(intentnew);
			break;
		case R.id.menu_dropbox_sy:
			Log.i("here", "dropbox");
			Intent intentdrop = new Intent(Archivos.this,
					DropBoxSyncronized.class);
			startActivity(intentdrop);
			break;
		case R.id.menu_google_drive:
			Log.i("here", "google drive");
			Intent intentGF = new Intent(Archivos.this,
					UploadGoogleFileActivity.class);
			startActivity(intentGF);
			break;
		case R.id.menu_dropbox:
			Log.i("here", "dropbox");
			Intent intentDF = new Intent(Archivos.this,
					UploadDropBoxFileActivity.class);
			startActivity(intentDF);
			break;
		}
		return true;
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// TODO Auto-generated method stub
		MenuInflater menuInflater = getMenuInflater();
		menuInflater.inflate(R.layout.menu_layout, menu);
		return true;
	}

	ArrayList<HashMap<String, String>> lista = new ArrayList<HashMap<String, String>>();

	// private void listFiles() {
	//
	// for (int i = 0; i < 8; i++) {
	// HashMap<String, String> map = new HashMap<String, String>();
	//
	// map.put(TAG_NOMBRE, "prueba" + i);
	// map.put(TAG_FILE_ID, "Google Drive");
	// lista.add(map);
	// }
	// ListAdapter adapter = new SimpleAdapter(Archivos.this, lista,
	// R.layout.archivos_list_item, new String[] { TAG_NOMBRE,
	// TAG_FILE_ID }, new int[] { R.id.list_nombre,
	// R.id.list_service });
	// setListAdapter(adapter);
	//
	// }

	private void showFilesOnUi() {
		GCloudSingleton gCloudSingleton = GCloudSingleton.getInstance();
		List<GCloudFile> fileList = gCloudSingleton.getFilesFromAllService();
		// ArrayList<HashMap<String, String>> lista = new
		// ArrayList<HashMap<String, String>>();
		if (fileList.isEmpty()) {
			return;
		}
		for (GCloudFile gCloudFile : fileList) {
			HashMap<String, String> mapUI = new HashMap<String, String>();

			mapUI.put(TAG_NOMBRE, gCloudFile.getName());
			mapUI.put(TAG_FILE_ID, gCloudFile.getKey());
			lista.add(mapUI);
		}

		// ArrayList<HashMap<String, String>> lista = new
		// ArrayList<HashMap<String, String>>();
		// for (int i = 0; i < 8; i++) {
		// HashMap<String, String> map = new HashMap<String, String>();
		//
		// map.put(TAG_NOMBRE, "prueba" + i);
		// map.put(TAG_FILE_ID, "Google Drive");
		// lista.add(map);
		// }

		ListAdapter adapter = new SimpleAdapter(Archivos.this, lista,
				R.layout.archivos_list_item, new String[] { TAG_NOMBRE,
						TAG_FILE_ID }, new int[] { R.id.list_nombre,
						R.id.list_service });
		setListAdapter(adapter);

	}

	// private void dropBoxAuthentication() {
	// AndroidAuthSession session = buildSession();
	// mApi = new DropboxAPI<AndroidAuthSession>(session);
	// checkAppKeySetup();
	// if (Archivos.mLoggedIn) {
	// Log.i("v()", "is still logged");
	// callDropBoxList();
	// } else {
	// Log.i("DropBoxAuthentication()", "is not logged");
	// mApi.getSession().startAuthentication(Archivos.this);
	// }
	// setLoggedIn(mApi.getSession().isLinked());
	// Log.i("DropBoxAuthentication", "Logged: "
	// + mApi.getSession().isLinked());
	// showToast("Logged: " + mApi.getSession().isLinked());
	// }

	// private void callDropBoxList() {
	// Log.i(TAG, "before to list");
	// ListDropBoxFile listDropBox = new ListDropBoxFile(Archivos.this, mApi,
	// "/");
	// Log.i(TAG, "before to execute");
	// listDropBox.execute();
	// Log.i(TAG, "after execute");
	// }

	// @Override
	// protected void onActivityResult(int requestCode, int resultCode, Intent
	// data) {
	// switch (requestCode) {
	// case REQUEST_ACCOUNT:
	// if (resultCode == RESULT_OK && data != null
	// && data.getExtras() != null) {
	// String accountName = data
	// .getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
	// credential.setSelectedAccountName(accountName);
	// service = getDriveServices(credential);
	// new CargarArchivos().execute();
	// Log.i("GCLOUD", "Ya entre a doInBackground :)");
	// // ListGoogleFile listGoogle = new ListGoogleFile(service,
	// // getApplicationContext());
	// Log.i("OnActivitty", "before to execute");
	// // try {
	// // listGoogle.execute();
	// // showFilesOnUi();
	// // } catch (Exception e) {
	// // Log.i("Exception catch", e.toString());
	// // // startActivityForResult(credential.newChooseAccountIntent(),
	// // // REQUEST_CONFIRMATION);
	// // }
	// Log.i("OnActivitty", "after execute");
	//
	// }
	// break;
	// case REQUEST_CODE:
	// if (resultCode == RESULT_OK) {
	// if (data != null) {
	// // Get the URI of the selected file
	// final Uri uri = data.getData();
	// try {
	// // Create a file instance from the URI
	// final File file = FileUtils.getFile(uri);
	// showToast("File selected: " + file.getAbsolutePath());
	// // UploadDropboxFile uploadDropBoxFile = new
	// // UploadDropboxFile(
	// // Archivos.this, mApi, "/", file);
	// // uploadDropBoxFile.execute();
	// UploadGoogleFile googleFile = new UploadGoogleFile(
	// service, Archivos.this, file);
	// googleFile.execute();
	// } catch (Exception e) {
	// Log.e("FileSelectorTestActivity", "File select error",
	// e);
	// }
	// }
	// }
	// break;
	// // case REQUEST_CONFIRMATION:
	// // startActivityForResult(credential.newChooseAccountIntent(),
	// // REQUEST_ACCOUNT);
	// // break;
	// }
	// }

	@Override
	protected void onResume() {
		super.onResume();
		// if (mApi.getSession() == null) {
		// Log.i("onResume()", "session null");
		// return;
		// }
		// AndroidAuthSession session = mApi.getSession();
		//
		// if (session.authenticationSuccessful()) {
		// try {
		// session.finishAuthentication();
		// TokenPair tokens = session.getAccessTokenPair();
		// storeKeys(tokens.key, tokens.secret);
		// setLoggedIn(true);
		// } catch (IllegalStateException e) {
		// showToast("Couldn't authenticate with Dropbox:"
		// + e.getLocalizedMessage());
		// Log.i(TAG, "Error authenticating", e);
		// }
		// }
	}

	// private Drive getDriveServices(GoogleAccountCredential credential) {
	// return new Drive.Builder(AndroidHttp.newCompatibleTransport(),
	// new GsonFactory(), credential).build();
	// }

	public void showToast(final String toast) {
		runOnUiThread(new Runnable() {
			@Override
			public void run() {
				Toast.makeText(getApplicationContext(), toast,
						Toast.LENGTH_SHORT).show();
			}
		});
	}

	// public void checkAppKeySetup() {
	// if (APP_KEY.startsWith("CHANGE") || APP_SECRET.startsWith("CHANGE")) {
	// showToast("You must apply for an app key and secret from developers.dropbox.com, and add them to the GCloud ap before trying it.");
	// return;
	// }
	// Intent testIntent = new Intent(Intent.ACTION_VIEW);
	// String scheme = "db-" + APP_KEY;
	// String uri = scheme + "://" + AuthActivity.AUTH_VERSION + "/test";
	// testIntent.setData(Uri.parse(uri));
	// PackageManager pm = getPackageManager();
	// if (0 == pm.queryIntentActivities(testIntent, 0).size()) {
	// showToast("URL scheme in your app's "
	// + "manifest is not set up correctly. You should have a "
	// + "com.dropbox.client2.android.AuthActivity with the "
	// + "scheme: " + scheme);
	// }
	// }

	// public AndroidAuthSession buildSession() {
	// AppKeyPair appKeyPair = new AppKeyPair(APP_KEY, APP_SECRET);
	// AndroidAuthSession session;
	//
	// String[] stored = getKeys();
	// if (stored != null) {
	// Log.i("buildSession", " getting key stored:");
	// AccessTokenPair accessToken = new AccessTokenPair(stored[0],
	// stored[1]);
	// session = new AndroidAuthSession(appKeyPair, AccessType.DROPBOX,
	// accessToken);
	// } else {
	// Log.i("buildSession",
	// "getting key not stored, going to build a new one");
	// session = new AndroidAuthSession(appKeyPair, AccessType.DROPBOX);
	// }
	// if (session != null) {
	// Log.i("buildSession", " session is not null");
	// }
	// return session;
	// }
	//
	// public String[] getKeys() {
	// SharedPreferences prefs = getSharedPreferences(ACCOUNT_PREFS_NAME, 0);
	// String key = prefs.getString(ACCESS_KEY_NAME, null);
	// String secret = prefs.getString(ACCESS_SECRET_NAME, null);
	// if (key != null && secret != null) {
	// String[] ret = new String[2];
	// ret[0] = key;
	// ret[1] = secret;
	// return ret;
	// } else {
	// return null;
	// }
	// }
	//
	// public void setLoggedIn(boolean loggedIn) {
	// Archivos.mLoggedIn = loggedIn;
	// Log.i("setLoggedIn() ", String.valueOf(mLoggedIn));
	// }
	//
	// public void storeKeys(String key, String secret) {
	// // Save the access key for later
	// SharedPreferences prefs = getSharedPreferences(ACCOUNT_PREFS_NAME, 0);
	// Editor edit = prefs.edit();
	// edit.putString(ACCESS_KEY_NAME, key);
	// edit.putString(ACCESS_SECRET_NAME, secret);
	// edit.commit();
	// }
	//
	// class CargarArchivos extends AsyncTask<String, String, String> {
	//
	// /**
	// * Before starting background thread Show Progress Dialog
	// * */
	// @Override
	// protected void onPreExecute() {
	// super.onPreExecute();
	// pDialog = new ProgressDialog(Archivos.this);
	// pDialog.setMessage("cargando archivos ...");
	// pDialog.setIndeterminate(false);
	// pDialog.setCancelable(false);
	// pDialog.show();
	// }
	//
	// GCloudSingleton gCloudSingleton;
	// /**
	// * getting Inbox JSON
	// * */
	// protected String doInBackground(String... voids) {
	//
	// Log.i("GCLOUD", "Ya entre a doInBackground :)");
	//
	// // new ListGoogleFile(service, getApplicationContext()).execute();
	//
	// // return "true";
	// List<com.google.api.services.drive.model.File> result = new
	// ArrayList<com.google.api.services.drive.model.File>();
	// Files.List request = null;
	// try {
	// request = service.files().list();
	// Log.i("retrieveAllFiles()", "getting files");
	// } catch (IOException e1) {
	// Log.i("retrieveAllFiles()", "something goes really wrong");
	// }
	// Log.i("retrieveAllFiles()", "to execute get Files");
	// if (request == null) {
	// Log.i("retrieveAllFiles() inside run",
	// "to execute get Files inside run");
	// return "false";
	// }
	// Log.i("retrieveAllFiles()", "request well formed ");
	// do {
	// try {
	// Log.i("ListGoogleFile", "Getting files");
	// FileList files = request.execute();
	// result.addAll(files.getItems());
	// request.setPageToken(files.getNextPageToken());
	// Log.i("ListGoogleFile", "Getting files at the end");
	// } catch (SocketException s) {
	// Log.i("ListGoogleFile", " SocketException: " + s);
	// return "false";
	// } catch (IOException e) {
	// System.out.println("An error occurred: " + e);
	// request.setPageToken(null);
	// return "false";
	// }
	// } while (request.getPageToken() != null
	// && request.getPageToken().length() > 0);
	// // TODO call singleton here
	//
	// if (result != null) {
	// gCloudSingleton = GCloudSingleton.getInstance();
	// gCloudSingleton.setFilesFromAllService(GCloudUtil
	// .googleFilesToGCloudFiles(result));
	// }
	// // String datasFromFilesD = "";
	// for (com.google.api.services.drive.model.File file : result) {
	// // datasFromFilesD += file.getTitle() + "  ";
	// Log.i("RetrieveAllFiles", "File title: " + file.getTitle());
	// }
	// // showToast(datasFromFilesD);
	// return "true";
	// }
	//
	// /**
	// * After completing background task Dismiss the progress dialog
	// * **/
	// protected void onPostExecute(String file_url) {
	// // dismiss the dialog after getting all products
	// pDialog.dismiss();
	// if(file_url.equalsIgnoreCase("true")){
	// showToast("everything well done");
	// }else{
	// showToast("probably something goes wrong");
	// }
	// // if(){
	// // startActivityForResult(credential.newChooseAccountIntent(),
	// // REQUEST_ACCOUNT);
	// // }
	// // updating UI from Background Thread
	// runOnUiThread(new Runnable() {
	// public void run() {
	// /**
	// * Updating parsed JSON data into ListView
	// * */
	// showFilesOnUi();
	// // GCloudSingleton gSingleton =
	// // GCloudSingleton.getInstance();
	// // Log.i("Archivos:", " "
	// // + gSingleton.getFilesFromAllService().size());
	// // ListAdapter adapter = new SimpleAdapter(Archivos.this,
	// // gSingleton.getFilesFromAllService(),
	// // R.layout.archivos_list_item, new String[] {
	// // TAG_NOMBRE, TAG_FILE_ID }, new int[] {
	// // R.id.list_nombre, R.id.list_service });
	// // updating listview
	// // setListAdapter(adapter);
	// }
	// });
	//
	// }
	//
	// }
}